package matrix;

/**
 * 73. 矩阵置零
 * 给定一个 m x n 的矩阵，如果一个元素为 0 ，则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
 * <p>
 * 示例 1：
 * 输入：matrix = [
 * [1,1,1],
 * [1,0,1],
 * [1,1,1]
 * ]
 * 输出：[
 * [1,0,1],
 * [0,0,0],
 * [1,0,1]
 * ]
 * <p>
 * 示例 2：
 * 输入：matrix = [
 * [0,1,2,0],
 * [3,4,5,2],
 * [1,3,1,5]
 * ]
 * 输出：[
 * [0,0,0,0],
 * [0,4,5,0],
 * [0,3,1,0]
 * ]
 */
public class Problem_73 {
    public static void main(String[] args) {
        new Problem_73().setZeroes(new int[][]{{0, 1, 2, 0}, {3, 4, 5, 2}, {1, 3, 1, 5}});
    }

    /**
     * 方法一：使用两个标记数组
     * 我们可以用2个一维标记数组 row 和 col 分别记录每一行和每一列是否有零出现。如果有的话，把对应下标位置更新为ture值。
     * 具体做法：
     * 首先遍历 matrix 数组一次，如果某个元素为 0，那么将该元素所在的行和列所对应的标记数组的位置置为 true。
     * 最后我们再次遍历 matrix 数组，根据标记数组更新 matrix 数组即可。
     */
    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        boolean[] row = new boolean[m];
        boolean[] col = new boolean[n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 0) {
                    row[i] = true;
                    col[j] = true;
                }
            }
        }

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (row[i] || col[j]) {
                    matrix[i][j] = 0;
                }
            }
        }
    }
}
